package controller

import (
	"errors"
	"msems/dao/mysql"
	"msems/logic"
	"msems/models"
	"strconv"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// SignUpHandler 注册
func SignUpHandler(c *gin.Context) {
	// 1.获取参数，参数校验
	p := new(models.ParamSignUp)
	// 在建结构体时进行了非空，长度限制，ShouldBind会进行校验
	if err := c.ShouldBind(p); err != nil {
		// 参数有误
		zap.L().Error("SignUpHandler ShouldBind err", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	//// 手动进行详细的校验
	//if p.Password != p.RePassword {
	//	// 参数有误
	//	zap.L().Error("SignUp with invalid param")
	//	c.JSON(http.StatusOK, gin.H{
	//		"msg": "两次密码不同",
	//	})
	//	return
	//}

	// 2.业务处理
	if err := logic.SignUp(p); err != nil {
		zap.L().Error("logic.SignUp(p) filed", zap.Error(err))
		ResponseError(c, CodeUserExist)
		return
	}
	// 3.返回响应
	ResponseSuccess(c, nil)
}

// AdminLoginHandler 登录
func AdminLoginHandler(c *gin.Context) {
	//1.参数验证
	p := new(models.ParamLogin)
	if err := c.ShouldBind(p); err != nil {
		// 参数有误
		zap.L().Error("AdminLoginHandler ShouldBind err", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	//2.业务处理
	user, err := logic.AdminLogin(p)
	if err != nil {
		zap.L().Error("logic.Login failed", zap.String("username", p.Username))
		//如果错误是mysql.ErrorUserNotExist(账号不存在)那么就返回用户不存在code
		if errors.Is(err, mysql.ErrorUserNotExist) {
			ResponseError(c, CodeUserNotExist)
			return
		}
		ResponseError(c, CodeInvalidPassword)
		return
	}
	// 3.返回响应
	ResponseSuccess(c, gin.H{
		"user_name": user.Username,
		"user_id":   strconv.FormatInt(user.UserID, 10), //转化为字符串，否则int64到前端超出范围的话可能失真
		"level":     user.Level,
		"email":     user.Email,
		"token":     user.Token,
	})
}

// AdminSendEmailHandler 验证邮箱发送验证码
func AdminSendEmailHandler(c *gin.Context) {
	//1.参数验证
	p := new(models.AdminEmail)
	if err := c.ShouldBind(p); err != nil {
		// 参数有误
		zap.L().Error("AdminSendEmailHandler ShouldBind err", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	err := logic.AdminSendEmail(p)
	if err != nil {
		// 参数有误
		zap.L().Error("logic.AdminSendEmail(p) err", zap.Error(err))
		ResponseError(c, CodeEmailNotExist)
		return
	}
	ResponseSuccess(c, nil)
}

// AdminCodeHandler 验证验证码
func AdminCodeHandler(c *gin.Context) {
	//1.参数验证
	p := new(models.AdminCode)
	if err := c.ShouldBind(p); err != nil {
		// 参数有误
		zap.L().Error("AdminCode ShouldBind err", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	//2. 验证验证码
	if err := logic.AdminCode(p); err != nil {
		// 参数有误
		zap.L().Error("logic.AdminCode(p) Param err", zap.Error(err))
		ResponseError(c, CodeCodeNotExist)
		return
	}
	//3.返回参数
	ResponseSuccess(c, nil)
}

// AdminChangePHandler  修改密码
func AdminChangePHandler(c *gin.Context) {
	// 1.获取参数，参数校验
	p := new(models.ParamSignUp)
	if err := c.ShouldBind(p); err != nil {
		// 参数有误
		zap.L().Error("AdminChangeP ShouldBind err", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	//2.修改密码
	if err := logic.AdminChangeP(p); err != nil {
		// 参数有误
		zap.L().Error("logic.AdminChangeP(p) err", zap.Error(err))
		ResponseError(c, CodeInvalidParam)
		return
	}
	//3.返回参数
	ResponseSuccess(c, gin.H{
		"username": p.Username,
		"password": p.Password,
	})
}
